package com.ytt.core.service.entity;

import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

/**
 * AbstractBaseEntity
 * 所有实体的基类，包含实体的共有字段
 * @author chenwen
 * @date 2019/9/12 15:08
 */
@MappedSuperclass
@EntityListeners({
        AuditingEntityListener.class
})
@Getter
@Setter
public class AbstractBaseEntity {
    /**
     * 主键，新增时应当为null，受限javascript的long型数据精度问题，DTO中需转换为字符串类型
     * 主键生成策略雪花算法
     */
    @Column(name = "id")
    @Id
    @GeneratedValue(generator = "snowflake")
    @GenericGenerator(name = "snowflake", strategy = "com.ytt.core.util.jpa.SnowflakeIdGenerator")
    private long id;


    /**
     * 创建数据的用户ID
     * 后台根据登录用户，自动填写
     */
    @Column(name = "created_by", updatable = false)
    @CreatedBy
    private Long createdBy;

    /**
     * 创建数据的时间，后台自动使用系统当前时间自动填写
     */
    @Column(name = "created_time", nullable = false, updatable = false)
    @CreatedDate
    private Date createdTime;

    /**
     * 根据创建者所属组织由系统自动生成的过滤路径，用于数据范围过滤, 为null或""表示没有。
     * 如果创建数据时此字段为空，则该数据会被替换为当前登录者的过滤路径
     */
    @Column(name = "filter_path", length = 380)
    private String filterPath;
}
